//=====================================================================
//
//
//
//=====================================================================
#ifndef KALEIDOSCOPE_GENERATOR_TYPE_ENVIRONMENT_GENERATOR_HPP
#define KALEIDOSCOPE_GENERATOR_TYPE_ENVIRONMENT_GENERATOR_HPP
//=====================================================================
#include <sooty/common/value_t.hpp>
#include <sooty/frontend/syntactic_analysis/parseme.hpp>
#include <sooty/frontend/semantic_analysis/symbol_table.hpp>
#include <sooty/treewalker/abstract_treewalker.hpp>
//=====================================================================
#include <kaleidoscope/kaleidoscope.hpp>
//=====================================================================
KALEIDOSCOPE_BEGIN
//=====================================================================
	

	
	
	
	
	
	class environment_creator
	{
		atma::sooty::parseme_ptr root_;
		atma::sooty::symbol_table* value_table_;
		atma::sooty::symbol_table* type_table_;
		
		atma::sooty::symbol_table& value_table() { return *value_table_; }
		atma::sooty::symbol_table& type_table() { return *type_table_; }
		
	public:
		void operator ()(atma::sooty::parseme_ptr_ref root, atma::sooty::symbol_table& vt, atma::sooty::symbol_table& tt)
		{
			root_ = root;
			value_table_ = &vt;
			type_table_ = &tt;
			
			start_rule(root_);
		}
	
	private:
		void start_rule(atma::sooty::const_parseme_ptr_ref);		
		void function(atma::sooty::const_parseme_ptr_ref);
		void parameter(atma::sooty::const_parseme_ptr_ref);
		void type(atma::sooty::const_parseme_ptr_ref);
	};
	
	//=====================================================================
	//
	//  the environment-setup pass
	//  ----------------------
	//    this pass fills the two symbol tables full:
	//      - the value_table, which is used for functions/variables, etc
	//      - the type_table, which is used for types, obv.
	//
	//=====================================================================
	class environment_setup_pass
	{
		typedef atma::sooty::parseme_ptr parseme_ptr;
		typedef atma::sooty::parseme_ptr_ref parseme_ptr_ref;
		typedef atma::sooty::const_parseme_ptr_ref const_parseme_ptr_ref;
		
		atma::sooty::symbol_table value_table_;
		atma::sooty::symbol_table type_table_;
		
		parseme_ptr root_;
		
	public:
		environment_setup_pass(const_parseme_ptr_ref root)
			: root_(root)
		{
		}
		
		void go() { start_rule(root_); }
		
		atma::sooty::symbol_table& value_table() { return value_table_; }
		atma::sooty::symbol_table& type_table() { return type_table_; }
		
	protected:
		void start_rule(const_parseme_ptr_ref);		
		void function(const_parseme_ptr_ref);
		void parameter(const_parseme_ptr_ref);
		
		std::string stringize_type(const_parseme_ptr_ref);
	};

//=====================================================================
KALEIDOSCOPE_CLOSE
//=====================================================================
#endif
//=====================================================================
